先做记录,有时间后做异常排查,代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
$raffle_members = RaffleMember::query()->where('raffle_id',148)->paginate();

// 使用 load 或 with
$raffle_members->load( [
'raffle:id,quota,used_quota,end_at,receive_prize_at,status,must_object_id,must_object_type,goods_id,user_id',
'raffle.clothe:id,describe,pic_id',
'raffle.clothe.cover:id,clothing_id,pic',
'raffle.receivePrize',
'raffle.shortVideo:id,cover_url,desc,title,object_id,object_type,video_url',

] );

$array = [];
$raffle_members->transform( function ( $raffle_member, $key ) use ( &$array ) {
if ( $raffle_member->raffle->receivePrize ) {
if ( $raffle_member->raffle->receivePrize->user_id === $raffle_member->user_id && array_get($raffle_member->raffle->receivePrize,'rest.raffle_order_item_id') && !in_array( $raffle_member->raffle->id, $array ) ) {
$raffle_member->raffle->receivePrize->is_receive_prize = true;
$array[] = $raffle_member->raffle->id;
} else {
$raffle_member->raffle->receivePrize->is_receive_prize = false;
}
}

return $raffle_member;
} );

return $raffle_members;

返回结果描述及临时解决方案

1
2
3
1、使用了 load 或 with 『预加载』关联数据,is_receive_prize 的结果将始终 false
2、未使用 load 或 with 『预加载』关联数据,is_receive_prize 的结果跟预期一致,但有 N + 1 问题
3、临时解决方案:使用『预加载』后再 toArray,再循环,问题得到解决